package com.hyxiao.order.service.impl;

import com.hyxiao.order.dto.OrderDTO;
import com.hyxiao.order.enums.ResultEnum;
import com.hyxiao.order.exception.SellException;
import com.hyxiao.order.service.OrderService;
import com.hyxiao.order.service.PayService;
import com.lly835.bestpay.enums.BestPayTypeEnum;
import com.lly835.bestpay.model.PayRequest;
import com.lly835.bestpay.model.PayResponse;
import com.lly835.bestpay.model.RefundRequest;
import com.lly835.bestpay.model.RefundResponse;
import com.lly835.bestpay.service.impl.BestPayServiceImpl;
import com.lly835.bestpay.utils.JsonUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;

/**
 * @program: order
 * @author: 潇歌
 * @create: 2020-11-12 17:11
 **/
@Service
@Slf4j
public class payServiceImpl implements PayService {

    @Autowired
    private BestPayServiceImpl bestPayService;

    @Autowired
    private OrderService orderService;

    private static final String ORDER_NAME = "微信点餐订单";

    @Override
    public PayResponse create(OrderDTO orderDTO) {

        PayRequest payRequest = new PayRequest();
        payRequest.setOpenid("oTgZpwYiIQb_55nghQ48FCwK6Qw0");
        payRequest.setOrderAmount(orderDTO.getOrderAmount().doubleValue());
        payRequest.setOrderId(orderDTO.getOrderId());
        payRequest.setOrderName(ORDER_NAME);
        payRequest.setPayTypeEnum(BestPayTypeEnum.WXPAY_H5);
        log.info("【微信支付】发起支付, request={}", JsonUtil.toJson(payRequest));

        PayResponse payResponse = bestPayService.pay(payRequest);
        log.info("【微信支付】发起支付, response={}", JsonUtil.toJson(payResponse));

        return payResponse;

    }

    @Override
    public PayResponse notify(String notifyData) {

        //  1.验证签名
        //  2.支付的状态
        //  3.支付金额
        //  4.支付人（下单人==支付人（不支持好友帮付功能））

        PayResponse payResponse = bestPayService.asyncNotify(notifyData);
        log.info("【微信支付】异步通知，payResponse={}" , JsonUtil.toJson(payResponse));

        //  查询订单
        OrderDTO orderDTO = orderService.findOne(payResponse.getOrderId());

        //  判断订单是否存在
        if (orderDTO == null){
            log.info("【微信支付】异步通知， 订单不存在，orderId={}", payResponse.getOrderId());
            throw new SellException((ResultEnum.ORDER_NOT_EXIST));
        }

        //  判断金额是否一致
        if (orderDTO.getOrderAmount().compareTo(new BigDecimal(payResponse.getOrderAmount())) !=0 ){
            log.info("【微信支付】异步通知， 订单金额不一致，orderId={}，微信通知金额={}, 系统金额={}", payResponse.getOrderId(),
                    payResponse.getOrderAmount(),
                    orderDTO.getOrderAmount());
            throw new SellException(ResultEnum.WXPAY_NOTIFY_MONEY_VERIFY_ERROR);
        }

        //  修改订单的支付状态
        orderService.paid(orderDTO);

        return payResponse;
    }

    @Override
    public RefundResponse refund(OrderDTO orderDTO) {
        RefundRequest refundRequest = new RefundRequest();
        refundRequest.setOrderId(orderDTO.getOrderId());
        refundRequest.setOrderAmount(orderDTO.getOrderAmount().doubleValue());
        refundRequest.setPayTypeEnum(BestPayTypeEnum.WXPAY_H5);
        log.info("【微信退款】request={}", JsonUtil.toJson(refundRequest));
        bestPayService.refund(refundRequest);

        RefundResponse refundResponse = bestPayService.refund(refundRequest);
        log.info("【微信退款】response={}", JsonUtil.toJson(refundResponse));

        return refundResponse;

    }

}
